home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C++ / Applications / PICSee Dust 1.01 / Quaternary Source / QDUtils.cpp < prev    next >
Text File  |  1995-11-07  |  5KB  |  135 lines

  1. /*
  2.     Version History:
  3.         2.0    Nov 5 95
  4.             Corrected CenterRect - the original algorithm ended up always
  5.             making innerRect an even height and width. I had used it for
  6.             over a year without noticing! (Probably because most of the
  7.             time all my rects were even-sized...)
  8. */
  9.  
  10. #include <Palettes.h>
  11. #include "QDUtils.h"
  12.  
  13. void CopyBitsToWindow(GWorldPtr sourceGWorld, WindowPtr destWindow, Rect *sourceR, Rect *destR, RgnHandle theClip) {
  14.     (void)LockPixels(GetGWorldPixMap(sourceGWorld));
  15.     CopyBits(GetGWorldBits(sourceGWorld), GetWindowBits(destWindow), sourceR, destR, srcCopy, theClip);
  16.     UnlockPixels(GetGWorldPixMap(sourceGWorld));
  17. } // END CopyBitsToWindow
  18.  
  19. void CopyBitsToGWorld(GWorldPtr sourceGWorld, GWorldPtr destGWorld, Rect *sourceR, Rect *destR, RgnHandle theClip) {
  20.     (void)LockPixels(GetGWorldPixMap(sourceGWorld));
  21.     (void)LockPixels(GetGWorldPixMap(destGWorld));
  22.     CopyBits(GetGWorldBits(sourceGWorld), GetGWorldBits(destGWorld), sourceR, destR, srcCopy, theClip);
  23.     UnlockPixels(GetGWorldPixMap(sourceGWorld));
  24.     UnlockPixels(GetGWorldPixMap(destGWorld));
  25. } // END CopyBitsToGWorld
  26.  
  27. // ---------------------------------------------------------------------------
  28.  
  29. void CenterRect(Rect *innerRect, Rect *outerRect) {
  30.     short outerRectWidth    = outerRect->right    - outerRect->left;
  31.     short outerRectHeight    = outerRect->bottom    - outerRect->top;
  32.     short innerRectWidth    = innerRect->right    - innerRect->left;
  33.     short innerRectHeight    = innerRect->bottom    - innerRect->top;
  34.     short hDiff                = (outerRectWidth - innerRectWidth) / 2;
  35.     short vDiff                = (outerRectHeight - innerRectHeight) / 2;
  36.     innerRect->left        = outerRect->left + hDiff;
  37.     innerRect->right    = innerRect->left + innerRectWidth;
  38.     innerRect->top        = outerRect->top + vDiff;
  39.     innerRect->bottom    = innerRect->top + innerRectHeight;
  40. } // END CenterRect
  41.  
  42. void MoveRectTo(Rect *theRect, short h, short v) {
  43.     register short width = theRect->right - theRect->left;
  44.     register short height = theRect->bottom - theRect->top;
  45.     theRect->left = h;
  46.     theRect->top = v;
  47.     theRect->right = theRect->left + width;
  48.     theRect->bottom = theRect->top + height;
  49. } // END MoveRectTo
  50.  
  51. void FlushRectTopLeft(Rect *theRect) {
  52.     MoveRectTo(theRect, 0, 0);
  53. } // END FlushRectTopLeft
  54.  
  55. void MoveRgnTo(short hLoc, short vLoc, RgnHandle theRgn) {
  56.     register short hDiff;
  57.     register short vDiff;
  58.     hDiff = hLoc - (**theRgn).rgnBBox.left;
  59.     vDiff = vLoc - (**theRgn).rgnBBox.top;
  60.      OffsetRgn(theRgn, hDiff, vDiff);
  61. } // END MoveRgnTo
  62.  
  63. void MoveRgnToRect(Rect *theRect, RgnHandle theRgn) {
  64.     register short hDiff;
  65.     register short vDiff;
  66.     vDiff = theRect->top - (**theRgn).rgnBBox.top;
  67.     hDiff  = theRect->left - (**theRgn).rgnBBox.left;
  68.     OffsetRgn(theRgn, hDiff, vDiff);
  69. } // END MoveRgnToRect
  70.  
  71. // ---------------------------------------------------------------------------
  72.  
  73. /*
  74.     CenterText does as its name implies: centers the text for you. Some points
  75.     worth of note:
  76.         a) You should set the port, font, fontsize, and font face first before
  77.             calling CenterText().
  78.  
  79.         b) CenterText() centers the text by calling _MoveTo.
  80.  
  81.         c) If horizCenter & vertCenter are both false, the routine positions
  82.             the pen at the bottom left corner of destRect.
  83. */
  84.  
  85. void CenterText(Str255 theText, Rect *destRect, Boolean horizCenter, Boolean vertCenter) {
  86.     short strWidth;        // Length of string, in pixels.
  87.     short strHeight;    // Height of string, in pixels.
  88.     short hDest, vDest;
  89.     FontInfo fInfo;
  90.  
  91.     GetFontInfo(&fInfo);
  92.  
  93.     strHeight = fInfo.ascent + fInfo.descent + fInfo.leading;
  94.     strWidth = StringWidth(theText);
  95.  
  96.     hDest = ((destRect->right - destRect->left) - strWidth) >> 1;
  97.     vDest = ((destRect->bottom - destRect->top) - strHeight) >> 1;
  98.  
  99.     if (horizCenter)
  100.         hDest = destRect->left + hDest;
  101.     else
  102.         hDest = destRect->left;    // Don't center, thus make no change in horiz position
  103.     
  104.     if (vertCenter)
  105.         vDest = destRect->bottom - vDest;
  106.     else
  107.         vDest = destRect->bottom;
  108.  
  109.     MoveTo(hDest, vDest);
  110. } // END CenterText
  111.  
  112. // ---------------------------------------------------------------------------
  113.  
  114. void SetMonitorDepth(GDHandle monitor, short depth, Boolean color) {
  115.     short flags;
  116.  
  117.     if (monitor != NULL) {
  118.         flags = 1 << gdDevType;
  119.         (void)SetDepth(monitor, depth, flags, color ? 1 : 0);
  120.     }
  121. } // END SetMonitorDepth
  122.  
  123. // ---------------------------------------------------------------------------
  124.  
  125. Boolean HasMonitorDepth(GDHandle monitor, short depth, Boolean color) {
  126.     short flags;
  127.  
  128.     if (monitor != NULL) {
  129.         color = true;
  130.         flags = 1 << gdDevType;
  131.         return(HasDepth(monitor, depth, flags, color ? 1 : 0));
  132.     }
  133.     else
  134.         return(false);
  135. } // END HasMonitorDepth